package Hash;

import java.util.HashMap;

//赎金信
public class ransom_note {
    /*
    * 给你两个字符串：ransomNote 和 magazine ，判断 ransomNote 能不能由 magazine 里面的字符构成。
        如果可以，返回 true ；否则返回 false。
        magazine 中的每个字符只能在 ransomNote 中使用一次。
        示例 1：
        输入：ransomNote = "a", magazine = "b"
        输出：false
    */

    /**
     *思路过程：
     * 题目解析：给两个字符串，然后判断ransomNote字符串能否由magazine构成，且这里ma的字母不能重复，所以这里得用map去记录次数
     * 思路：将ma的字母记录在map，key为字母，value为次数，然后在遍历ran的时候，判断map中是否有且次数不为0的
     */
    public boolean canConstruct(String ransomNote, String magazine) {
        HashMap<Character,Integer> map=new HashMap<>();
        //这里得到了ma字符串的字母记录
        for (int i = 0; i < magazine.length(); i++) {
            char a=magazine.charAt(i);
            map.put(a,map.getOrDefault(a,0)+1);
        }
        //下面去遍历ran的
        for (int i = 0; i < ransomNote.length(); i++) {
            char a=ransomNote.charAt(i);
            //这里去判断是否存在，如果存在且次数不为0，则代表可以将这个构成ran的一部分
            if(map.containsKey(a)&&map.get(a)!=0){
                //将次数减1，避免重复，继续判断下一个
                map.put(a,map.get(a)-1);
            }else {
                //如果有一个不一样，就代表不能构成，则返回false
                return false;
            }
        }
        return true;
    }
}
